{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b099f91d",
   "metadata": {},
   "source": [
    "# Arxiv\n",
    "\n",
    "[arXiv](https://arxiv.org/)은 물리학, 수학, 컴퓨터 과학, 정량 생물학, 정량 금융, 통계, 전기공학 및 시스템 과학, 경제학 분야의 200만 편의 학술 논문을 위한 오픈 액세스 아카이브입니다."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "07926d71",
   "metadata": {},
   "source": [
    "[API 도큐먼트](https://api.python.langchain.com/en/latest/document_loaders/langchain_community.document_loaders.arxiv.ArxivLoader.html#langchain_community.document_loaders.arxiv.ArxivLoader)\n",
    "\n",
    "Arxiv 문서 로더에 접근하려면 `arxiv`, `PyMuPDF` 및 `langchain-community` 통합 패키지를 설치해야 합니다. \n",
    "\n",
    "`PyMuPDF` 는 arxiv.org 사이트에서 다운로드한 PDF 파일을 텍스트 형식으로 변환합니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2f2694ec",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 설치\n",
    "# !pip install -qU langchain-community arxiv pymupdf"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae19348f",
   "metadata": {},
   "source": [
    "## 객체 생성\n",
    "\n",
    "이제 **model** 객체를 인스턴스화하고 문서를 로드할 수 있다:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d28d77a4",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import ArxivLoader\n",
    "\n",
    "# Query 에 검색하고자 하는 논문의 주제를 입력합니다.\n",
    "loader = ArxivLoader(\n",
    "    query=\"Chain of thought\",\n",
    "    load_max_docs=2,  # 최대 문서 수\n",
    "    load_all_available_meta=True,  # 메타데이터 전체 로드 여부\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d3037bd6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 문서 로드 결과출력\n",
    "docs = loader.load()\n",
    "docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9f18bc2f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 문서 메타데이터 출력\n",
    "docs[0].metadata"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd58a907",
   "metadata": {},
   "source": [
    "`load_all_available_meta=False` 인 경우 메타데이터는 전체가 아닌 일부만 출력됩니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5cb84ee3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Query 에 검색하고자 하는 논문의 주제를 입력합니다.\n",
    "loader = ArxivLoader(\n",
    "    query=\"ChatGPT\",\n",
    "    load_max_docs=2,  # 최대 문서 수\n",
    "    load_all_available_meta=False,  # 메타데이터 전체 로드 여부\n",
    ")\n",
    "\n",
    "# 문서 로드 결과출력\n",
    "docs = loader.load()\n",
    "\n",
    "# 문서 메타데이터 출력\n",
    "docs[0].metadata"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70249aec",
   "metadata": {},
   "source": [
    "## 요약(summary)\n",
    "\n",
    "- 논문의 전체 내용이 아닌 요약본을 출력하고자 한다면, `get_summaries_as_docs()` 함수를 호출하면 됩니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8117a593",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 문서 요약 로딩\n",
    "docs = loader.get_summaries_as_docs()\n",
    "\n",
    "# 첫 번째 문서 접근\n",
    "print(docs[0].page_content)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f788cb47",
   "metadata": {},
   "source": [
    "## lazy_load()\n",
    "\n",
    "문서를 대량으로 로드할 때 모든 로드된 문서의 부분 집합에 대해 하류 작업을 수행할 수 있다면, 메모리 사용량을 최소화하기 위해 문서를 한 번에 하나씩 지연 로드할 수 있습니다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b230a0f6",
   "metadata": {},
   "outputs": [],
   "source": [
    "docs = []\n",
    "\n",
    "# 문서 지연 로드\n",
    "for doc in loader.lazy_load():\n",
    "    docs.append(doc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "37793c1a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 결과 출력\n",
    "docs"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "langchain-kr-lwwSZlnu-py3.11",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
